package univ.lille1.fr.car.tests;

import static org.junit.Assert.*;
import static com.jayway.restassured.RestAssured.*;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import univ.lille1.fr.car.ejb.Auteur;
import univ.lille1.fr.car.ejb.Livre;
import univ.lille1.fr.car.manager.AuteurManager;
import univ.lille1.fr.car.manager.LivreManager;


public class Tests {
	
	LivreManager livreManager = new LivreManager();
	AuteurManager auteurManager = new AuteurManager();
	
	public String titre = "AAAA";
	public String annee = "2014";
	
	public long auteurId = 99;
	public String nom = "TEST";
	public String prenom = "JUNIT";
	
	private final String host = "http://localhost:8080/TP_Library/";

	@Test
	public void connection(){
		// test avec un user correc
		String s = given().param("user", "toto").param("password", "toto").post(host + "connexion/").asString();
		assertTrue("nom utilisateur invalide", s.contains("reussi"));

		// test avec un user incorrect
		s = given().param("user", "tata").param("password", "toto").post(host + "connexion/").asString();
		assertFalse("l'utilisateur n'est pas incorrect", s.contains("reussi"));

		// test avec un mot de passe incorrect
		s = given().param("user", "toto").param("password", "qsdqsdqs").post(host + "connexion/").asString();
		assertFalse("le mot de passe n'est pas incorrect", s.contains("reussi"));
	}
	
	@Test
	public void testAddBook(){
		// on initialise la base au cas où elle ne serait pas initialisée (on la fait qu'une fois au début)
		this.init();
		// on cherche si le livre n'est pas déjà présent
		Livre livre = livreManager.getEntityManager().find(Livre.class, titre);
		assertNull("Le livre existe déjà", livre);
		// on ajoute le livre
		livreManager.add(titre, annee);
		// on cherche si le livre a été ajouté
		livre = livreManager.getEntityManager().find(Livre.class, titre);
		assertNotNull("Le livre n'a pas été ajouté", livre);
	}
	
	@Test
	public void testRemoveBook(){
		// on cherche si le livre est dans la bdd
		Livre livre = livreManager.getEntityManager().find(Livre.class, titre);
		assertNotNull("Le livre n'existe pas", livre);
		// on supprime le livre
		livreManager.remove(titre);
		// on vérifie que le livre n'existe plus
		livre = livreManager.getEntityManager().find(Livre.class, titre);
		assertNull("Le livre n'a pas été supprimé", livre);
	}
	
	@Test
	public void testAddAuthor(){
		// on cherche si l'auteur n'est pas dans la bdd
		Auteur auteur = auteurManager.getEntityManager().find(Auteur.class, auteurId);
		assertNull("L'auteur existe déjà", auteur);
		// on ajoute l'auteur
		auteurManager.add(auteurId, nom, prenom);
		// on vérifie que l'ajout a bien été fait
		auteur = auteurManager.getEntityManager().find(Auteur.class, auteurId);
		assertNotNull("L'auteur n'a pas été ajouté", auteur);
	}
	
	@Test
	public void testRemoveAuthor(){
		// on cherche si l'auteur est present dans la bdd
		Auteur auteur = auteurManager.getEntityManager().find(Auteur.class, auteurId);
		assertNotNull("L'auteur n'existe pas", auteur);
		// on supprime l'auteur
		auteurManager.remove(auteurId);
		// on vérifie que suppression a bien été faite
		auteur = auteurManager.getEntityManager().find(Auteur.class, auteurId);
		assertNull("L'auteur n'a pas été supprimé", auteur);
	}
	
	public void init(){
		List<Livre> listeLivres = new ArrayList<Livre>();
		List<Auteur> listeAuteurs = new ArrayList<Auteur>();
		
		// on cherche s'il y a des livres de présent dans la bdd
		listeLivres = livreManager.findAll();
		listeAuteurs = auteurManager.findAll();
		
		// initialisation de la base donnée si aucun auteur présent
		if(listeAuteurs.isEmpty()) {
			auteurManager.init();
		}
		
		// initialisation de la base donnée si aucun livre présent
		if(listeLivres.isEmpty()) {
			livreManager.init();
		}
	}
}
